package com.atguigu.service.impl;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.atguigu.entity.excel.DistrictInfoExcel;
import com.atguigu.listener.ExcelVoListener;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.entity.DistrictInfo;
import com.atguigu.service.DistrictInfoService;
import com.atguigu.mapper.DistrictInfoMapper;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author 84445
* @description 针对表【district_info】的数据库操作Service实现
* @createDate 2025-04-27 23:15:00
*/
@Service
public class DistrictInfoServiceImpl extends ServiceImpl<DistrictInfoMapper, DistrictInfo>
    implements DistrictInfoService{

    @Autowired
    private ExcelVoListener excelVoListener;

    @SneakyThrows
    @Override
    public void exportCates(HttpServletResponse response) {
        //1、加载分类数据 转为excel需要的对象集合
        List<DistrictInfoExcel> districtInfoExcels = this.list().stream().map(districtInfo -> {
            // 职责单一： CategoryExcelVo映射excel文件中的一行数据
            DistrictInfoExcel vo = new DistrictInfoExcel();
            BeanUtils.copyProperties(districtInfo, vo);
            return vo;
        }).collect(Collectors.toList());
        //2、配置响应头
        //如果文件是浏览器可以解析的类型 使用content-type：图片 html  json txt  xml...
//        response.setContentType();
        //如果文件浏览器无法解析，可以使用content-disposition: 告诉浏览器以附件的形式下载
        String fileName = URLEncoder.encode("商品分类_","UTF-8")+
                LocalDateTime.now(ZoneId.of("+8"))
                        .format(DateTimeFormatter.ofPattern("yyyy_MM_dd"))
                + ExcelTypeEnum.XLSX.getValue();
        response.setHeader("content-disposition" , "attachment;filename="+fileName);
        //3、写到excel文件中  将文件写入到响应体中
        EasyExcel.write(response.getOutputStream()) //easyexcel将excel文件写入到 响应体中
                .excelType(ExcelTypeEnum.XLSX) // csv , xls , xlsx(新格式 压缩保存)
                .sheet("商品分类") //写入到excel文件的哪个工作簿中
                .head(DistrictInfoExcel.class) // excel文件的表头 需要和数据一致  默认使用CategoryExcelVo的属性名当作标题
                .doWrite(districtInfoExcels); //配置数据 写入到excel文件中

    }

    @SneakyThrows
    @Override
    public void importCates(MultipartFile file) {

        //1、判断文件大小 和扩展名
        if(file.isEmpty()){
            throw new RuntimeException("文件不能为空");
        }
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."))
                .toLowerCase();// 获取文件扩展名
        List<String> suffixList = Arrays.asList(".xls", ".xlsx", ".csv");// 允许上传的文件类型
        if(!suffixList.contains(suffix)){
            throw new RuntimeException("文件类型错误");
        }
        //2、解析excel文件中的分类数据
        // 必须有和excel文件映射的实体类(哪一列的数据 通过哪个属性来加载的映射)
        EasyExcel.read(file.getInputStream())
                .sheet(0) //读取上传的excel文件的第一个工作薄
                .head(DistrictInfoExcel.class)// 使用这个vo类 解析excel文件中的数据
                .registerReadListener(excelVoListener) //组成回调监听器(easyexcel没读一行数据 就回调一次 监听器的方法处理数据)
                .doRead();//开始解析excel文件
        //3、将解析的数据保存到分类表中

    }


}




